package br.com.foxinline.servico;

import br.com.foxinline.modelo.ContaBancaria;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.utilitario.Caracteres;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author cadomeireles
 */
@Stateless
public class PessoaServico extends ServicoGenerico<Pessoa> {

    public PessoaServico() {
        super(Pessoa.class);
    }

    @Override
    public void salvar(Pessoa entidade) {
        entidade.setSlugNome(Caracteres.removeCaracteresEspeciais(entidade.getNome()));
        super.salvar(entidade);
    }

    public List<Pessoa> pesquisarCliente(Pessoa pessoa) {
        String sql = "select pessoa from Pessoa pessoa where pessoa.ativo = true and pessoa.categoriaPessoa like 'CLIENTE'";

        if (pessoa.getCpf() != null && !pessoa.getCpf().isEmpty()) {
            sql += " and pessoa.cpf like '" + Caracteres.removecaracter(pessoa.getCpf()) + "'";
        }

        if (pessoa.getCnpj() != null && !pessoa.getCnpj().isEmpty()) {
            sql += " and pessoa.cnpj like '" + Caracteres.removecaracter(pessoa.getCnpj()) + "'";
        }

        if (pessoa.getNome() != null && !pessoa.getNome().isEmpty()) {
            sql += " and lower(pessoa.slugNome) like '%" + pessoa.getNome().toLowerCase().trim() + "%'";
        }

        if (pessoa.getRazaoSocial() != null && !pessoa.getRazaoSocial().isEmpty()) {
            sql += " and lower(pessoa.razaoSocial) like '%" + pessoa.getRazaoSocial().toLowerCase().trim() + "%'";
        }

        if (pessoa.getTipoPessoa() != null) {
            sql += " and pessoa.tipoPessoa = :tipoPessoa";
        }

        sql += " order by pessoa.nome";
        Query query = getEntityManager().createQuery(sql);

        if (pessoa.getTipoPessoa() != null) {
            query.setParameter("tipoPessoa", pessoa.getTipoPessoa());
        }

        return query.getResultList();
    }

    public List<Pessoa> pesquisarCliente(Pessoa pessoa, List<Pessoa> adquirentesAtuais, List<Pessoa> adquirentesSelecionados) {
        String sql = "select pessoa from Pessoa pessoa where pessoa.ativo = true and pessoa.categoriaPessoa like 'CLIENTE'";

        if (pessoa.getCpf() != null && !pessoa.getCpf().isEmpty()) {
            sql += " and pessoa.cpf like '" + Caracteres.removecaracter(pessoa.getCpf()) + "'";
        }

        if (pessoa.getCnpj() != null && !pessoa.getCnpj().isEmpty()) {
            sql += " and pessoa.cnpj like '" + Caracteres.removecaracter(pessoa.getCnpj()) + "'";
        }

        if (pessoa.getNome() != null && !pessoa.getNome().isEmpty()) {
            sql += " and lower(pessoa.slugNome) like '%" + pessoa.getNome().toLowerCase().trim() + "%'";
        }

        if (pessoa.getRazaoSocial() != null && !pessoa.getRazaoSocial().isEmpty()) {
            sql += " and lower(pessoa.razaoSocial) like '%" + pessoa.getRazaoSocial().toLowerCase().trim() + "%'";
        }

        if (pessoa.getTipoPessoa() != null) {
            sql += " and pessoa.tipoPessoa = :tipoPessoa";
        }

        String ids = new String();

        if (adquirentesAtuais != null && !adquirentesAtuais.isEmpty()) {
            for (int i = 0; i < adquirentesAtuais.size(); i++) {
                ids += adquirentesAtuais.get(i).getId();
                if (i != adquirentesAtuais.size() - 1) {
                    ids += ", ";
                }
            }
        }
        
       if (adquirentesSelecionados != null && !adquirentesSelecionados.isEmpty()) {
           if (ids.length() > 0) {
               ids += ", ";
           }

            for (int i = 0; i < adquirentesSelecionados.size(); i++) {
                ids += adquirentesSelecionados.get(i).getId();
                if (i != adquirentesSelecionados.size() - 1) {
                    ids += ", ";
                }
            }
       }
              
        if (adquirentesAtuais != null && !adquirentesAtuais.isEmpty() || adquirentesSelecionados != null && !adquirentesSelecionados.isEmpty()) {
           sql += " and pessoa.id not in (" + ids + ")";
        }
       
        sql += " order by pessoa.nome";

        Query query = getEntityManager().createQuery(sql);

        if (pessoa.getTipoPessoa() != null) {
            query.setParameter("tipoPessoa", pessoa.getTipoPessoa());
        }

        return query.getResultList();
    }

    public List<Pessoa> pesquisarFornecedor(Pessoa pessoa) {
        String sql = "select pessoa from Pessoa pessoa where pessoa.ativo = true and pessoa.tipoPessoa like 'JURIDICA' and pessoa.categoriaPessoa like 'FORNECEDOR'";

        if (!pessoa.getCnpj().isEmpty()) {
            sql += " and pessoa.cnpj like '" + Caracteres.removecaracter(pessoa.getCnpj()) + "'";
        }

        if (pessoa.getNome() != null && !pessoa.getNome().isEmpty()) {
            sql += " and lower(pessoa.slugNome) like '%" + pessoa.getNome().toLowerCase().trim() + "%'";
        }

        Query query = getEntityManager().createQuery(sql);

        return query.getResultList();
    }

    public List<ContaBancaria> obterContasBancarias(Pessoa pessoa) {
        String sql = "select pessoa.contasBancarias from Pessoa pessoa where pessoa.id = :id";

        Query query = getEntityManager().createQuery(sql);

        query.setParameter("id", pessoa.getId());

        return query.getResultList();

    }

    @Override
    public void deletar(Pessoa pessoa) {
        pessoa.setAtivo(false);
        super.atualizar(pessoa);
    }

    public List<Pessoa> autocompletar(String query) {
        return buscarPeloNome(query);
    }

    public List<Pessoa> buscarPeloNome(String query) {
        List<Pessoa> pessoas = getEntityManager().createQuery("select pessoa from " + Pessoa.class.getSimpleName() + " pessoa where lower(pessoa.slugNome) like '%" + query.toLowerCase().trim() + "%'").getResultList();
        return pessoas;
    }
}
